除了前一日的 SimpleCommandLinePropertySource 之外,這裡官方提到的另一個實作CommandLinePropertySource 子類就是這裡的 JOptCommandLinePropertySource 。
那什麼是JOpt…..這源自於 joptsimple ,那這個是什麼 ?
這是一個專案,是一個用來解析指令列選項的 Java Library 。
public class JOptCommandLinePropertySource
extends CommandLinePropertySource<joptsimple.OptionSet>
上方來自 org.springframework.core.env JOptCommandLinePropertySource 的內容,
這裡看到抽象父類別的範型為 joptsimple.OptionSet,那我們看一下 joptsimple 其下的 OptionSet。
jOpt 給類別 OptionSet 的描述如下
Representation of a group of detected command line options, their arguments, and non-option arguments.
代表一群偵測到的指令選擇,他們的參數, 和非選擇參數。
下方範例簡單說明如何使用 joptsimple
import joptsimple.OptionParser;
import joptsimple.OptionSet;
public class OptionParserTest {
public static void main(String[] args) throws Exception {
OptionParser parser = new OptionParser();
parser.accepts("zookeeper", "it is required").withRequiredArg().
describedAs("zookeeper connect address.").ofType(String.class);
OptionSet options = parser.parse(args);
if (!options.has("zookeeper")) {
throw new Exception("zookeeper is required");
}
System.out.println((String)options.valueOf("zookeeper"));
}
}
若將上述內容打包成 jar 包,並執行下方指令
java -jar OptionParserTest
因爲這裡有透過 OptionSet.has(String option) 檢查使用者是否有提供 Option Argument zookeeper,沒有的話就會會傳丟出例外,達到提示使用者的效用。
如果使用者輸入以下指
java -jar OptionParserTest --zookeeper localhost:2181
那終端就會顯示 localhost:2181
這個例子使用的 zookeeper ,其實意指 Kafka 底層技術會用到的 Apache ZooKeeper 。
而 Kafka 確實會用到 jopt 這個 Library 去檢查使用者輸入的參數。
Kafka 再啟動之初會需要透過 Option Argument zookeeper-server 提供 port 號,但後來
Option Argument 改成 bootstrap-server ,若仍用舊的 zookeeper-server ,就會遇到
Kafka 拋出例外 joptsimple.UnrecoginizedOption
參考資料
{官方} JOptCommandLinePropertySource
{官方} JOpt OptionSet
https://jopt-simple.github.io/jopt-simple/apidocs/joptsimple/OptionSet.html
JOpt 解析命令列
https://blog.csdn.net/yangyijun1990/article/details/109137504